import org.apache.spark.{SparkConf, SparkContext}

// 定义WordCount对象，这是Scala中执行程序的标准方式之一
object WordCount {
  def main(args: Array[String]): Unit = {
    // 创建一个Spark配置对象，设置应用名称和运行模式（这里是在本地运行，使用所有可用的CPU核心）
    val conf = new SparkConf().setAppName("WordCount").setMaster("local[*]")
    // 创建一个SparkContext对象，它是Spark应用程序的入口点
    val sc = new SparkContext(conf)

    // 指定要读取的文本文件的路径
    val filePath = "C:\\Users\\86155\\Documents\\WeChat Files\\wxid_zvbzc6h141a722\\FileStorage\\File\\2024-10\\data.txt"
    // 使用SparkContext的textFile方法读取文件，返回一个RDD（弹性分布式数据集）
    val data = sc.textFile(filePath)

    // 对数据执行转换操作
    // 1. 对每一行使用map操作，首先按照特殊字符"\\00A"（注意：这通常不是标准的行分隔符，可能需要根据实际情况调整）分割行
    // 2. 然后取分割后的数组的第三个元素（索引为2，因为索引从0开始），并基于空格进一步分割，假设第一个子字符串是类别
    // 3. 将每个类别映射为一个（类别, 1）的元组
    val categoryCounts = data.map(line => {
      val parts = line.split("\\\\00A") // 注意：这里使用了四个反斜杠来转义反斜杠字符，表示一个实际的反斜杠
      val categoryAndQuantity = parts(2).split(" ")
      (categoryAndQuantity(0), 1) // 假设categoryAndQuantity(0)是类别名
    }).reduceByKey(_ + _) // 使用reduceByKey操作来汇总相同类别的计数

    // 收集结果到驱动程序并打印
    categoryCounts.collect().foreach { case (category, count) =>
      println(s"($category, $count)") // 打印每个类别及其对应的计数
    }

    // 停止SparkContext，释放资源
    sc.stop()
  }
}